
console.log("---------------------------接口-索引结构-------------------------------");
interface IArray{
    [index:number]:string;//定义索引类型是number，返回值是string
    // [index:string]:string;
}

let arr :IArray;
arr = ["1","2"];
let value:string = arr[0];//string类型

console.log(value);

console.log("---------------------------接口-构造器约束-------------------------------");

/**
 * 1.构造器约束无法被继承实现
 * 2.构造器是静态部分，不受编译器检查，我们需要手动增加一个函数，让编译器进行检查
 */
interface T{
    new (a:number,b:string);//这就是构造器约束，但编译器无法检测
}

// class Child1 implements T{ //报错，无法被继承实现
//     constructor(a:number,b:string){}
// }

interface Click{
    click():void;
}

class Child1 implements Click{
    
    constructor(a:number,b:string){}//符合约束 T 的构造器约束

    click():void {
        console.log("child1 click")
    }
}

class Child2 implements Click{
    
    constructor(a:number,b:number){}//符合约束 T 的构造器约束

    click():void {
        console.log("child2 click")
    }
}

//使用此函数可使得编译器进行约束检测
function checkTConstruct(obj:T,a:number,b:string):Click{
    return new obj(a,b);
}

let clickObj = checkTConstruct(Child1,1,"a");
// let click2Obj = checkTConstruct(Child2,2,"b");  // 报错，编辑器检测出构造器不符合，所以报错
clickObj.click();


